#include <iostream>

using namespace std;
class A {
public:
	virtual void f1() {
		cout<<"A:: f1"<<endl;
	}
	
	virtual void f2() {
		cout<<"A:: f2"<<endl;
	}
	
	void f3() {
		cout<<"A:: f3"<<endl;
	}
	
	void f4() {
		cout<<"A:: f4"<<endl;
	} 
};

class B: public A {
public:
	virtual void f1() {
		cout<<"B:: f1"<<endl;
	} 
	virtual void f2(int x) {
		cout<<"B:: f2"<<endl;
	}
	
	virtual void f3() {
		cout<<"B:: f3"<<endl;
	}
	
	void f4() {
		cout<<"B:: f4"<<endl;
	}
};

int main(int argc, char *argv[]) {
	/*
		要调用多态方法：
			1、使用public继承
			2、方法前面有virtual修饰
			3、通过 指针* 或者 &引用 调用
	*/
	B b1;
	A* p1=&b1;
	p1->f1();//B:: f1
	p1->f2();//A:: f2	子类改变了该方法，无法实现多态，调用基类方法
	
	p1->f3();//A:: f3
	p1->f4();//A:: f4
	
	cout << "===============" << endl;
	
	//基类方法前面有virtual修饰，且子类不改变方法
	B b2; 
	A& a1=b2;
	a1.f1();//B:: f1
	a1.f2();//A:: f2	子类改变了该方法，无法实现多态，调用基类方法
	a1.f3();//A:: f3
	a1.f4();//A:: f4
	
	cout << "===============" << endl;
	
	//必须通过 指针* 或者 &引用 调用 -- 否则调用基类方法
	B b3; 
	A a=b3; 
	a.f1();// A:: f1
	a.f2();// A:: f2
	a.f3();// A:: f3
	a.f4();// A:: f4
}